[REFACTOR] API 중복 호출 방지 & 중복 투표 오류 해결 #402
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Issue Number
#401
As-Is
To-Be
Check List
Test Screenshot
쓰로틀링
throttle의 delay는 3초 이상일 때 32% 의 유저가 떠난다고 하는 구글 설문조사를 보고 3초로 결정하였습니다. 3초 안에 응답이 안올 경우 다시 요청을 보낼 수 있는데, 그런 상황이라면 서비스의 문제가 생겼다고 판단하였습니다.
따라서 3초 이내의 요청만 쓰로틀링이 걸려 과도한 API 요청을 막도록 개선하였습니다.
중복 투표 오류 해결
타이머가 종료된 시점에 옵션만 누르고 선택 버튼을 누르지 않을 경우 투표가 되는 기능을 추가했었습니다.
하지만 타이머가 종료될 때 투표 API가 이미 호출되었는데, 화면이 넘어가는 응답값(isFinished:true)을 받기 전에 선택 버튼을 클릭하면 에러가 발생합니다. 서버에 이미 투표가 반영되었으니 중복 투표 에러가 뜨는데, 실제 결과에는 반영이 되므로 사용자 경험을 해치게 됩니다.
따라서 투표 API가 한번 호출되면 선택 완료 state값을 변경하여 disabled 처리가 되도록 수정하였습니다.
낙관적 업데이트처럼 미리 disabled 처리를 했는데, 이를 클라이언트 상태로 처리한 부분이 어색하긴 합니다! 근데 좋아요 기능처럼 이미 받고 있던 서버 응답값의 변화를 감지할 수 없어 이렇게 처리하였습니다. API 요청이 실패할 경우 다시 되돌리는 로직도 추가하였습니다!
닉네임 페이지 리팩토링
닉네임 페이지에 isJoinable이 false일 때 보여주는 에러 폴백 UI가 섞여 있었습니다. 저는 이를 잘못된 경로로 접근한 경우 또는 게임이 이미 시작한 경우로 판단하였습니다. 따라서 기존의 에러 폴백 UI를 보여주는 게 적절하다고 생각하여 isJoinable이 false일 때 CustomError를 반환하여 에러 바운더리에 걸리도록 구현하였습니다.
(Optional) Additional Description
handleMakeOrEnterRoom 을 handleAccessRoom으로 바꿨는데 바로 이해가 되는지 궁금해요!
그리고 취향일 수도 있겠지만 조건이 2개일 때 이벤트 핸들러 함수를 감싼 후 안에서 분기처리하는 것보다 props로 넘겨줄 때 분기처리 하는 게 직관적이다고 느꼈어요! 이것도 의견 주시면 좋을 것 같아용
함수 안에서 분기 처리
props로 넘겨줄 때 분기처리
🌸 Storybook 배포 주소